package com.wzdigit.wms.wms.task;

import com.wzdigit.mes.basic.api.BasicSaleOrderApi;
import com.wzdigit.wms.wms.service.order.AsnService;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.stereotype.Component;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 内销机&散件入库后自动出库 定时任务
 */

@ConditionalOnExpression("${schedule.common.switch}")
@Component
@EnableScheduling
@Slf4j
//public class AutoStockOutSchedule implements SchedulingConfigurer {
public class AutoStockOutSchedule {
//public class AutoStockOutSchedule {

    @Value("${schedule.auto_out_stock.start_flag}")
    private Boolean startScheduleFlag;

    @Value("${schedule.auto_out_stock.frequency}")
    private String cron;

    @Autowired
    AsnService asnService;

    @Reference(version = "${dubbo.providers.basic.BasicSaleOrder.api:1.0.0}" ,check = false,timeout = 30_000)
    BasicSaleOrderApi basicSaleOrderApi;

    final Lock lock = new ReentrantLock();

//    @Override
//    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
//        //根据CRON构建定时任务
//        taskRegistrar.addCronTask(() -> {
//
//            lock.lock();
//            try {
//                //定时任务逻辑
//                log.info("【数据回写】定时任务执行");
//                //从入库单出发，去类型是“R01”，UDF1 是 null的入库单，关联入库单明细表，
//                // 通过SO关联销售订单、销售订单明细，获取 销售订单 内外销标识、是否散件标识。
//                // 如果内销 或者 散件的，把这个入库单的SN做一个出库。
//                String prdReceiveCode = AsnTypeEnum.PRD_RECEIVE.getCode();//R01
//                String udf1 = null;
//                List<AsnSaleInDto> asnSaleInDtoList = asnService.selectInSale(prdReceiveCode, udf1);
//
//                //销售订单号集合
//                List<String> soNOList = asnSaleInDtoList.stream()
//                        .filter(s -> s.getSoNo() != null)
//                        .map(s -> s.getSoNo())
//                        .distinct()
//                        .collect(Collectors.toList());
//
//                //销售订单行号集合
//                List<String> soLineNoList = asnSaleInDtoList.stream().
//                        filter(s -> s.getSoLineNo() != null)
//                        .map(s -> s.getSoLineNo())
//                        .distinct()
//                        .collect(Collectors.toList());
//
//                List<SaleOrderAndDtlDto> saleOrderAndDtlDtoList  = new ArrayList<>();
//                //处理SQL1000异常
//                if (soNOList.size()>999) {
//                    List<List<String>> splitList = MyListUtil.splitList(soNOList, 999);
//                    for (List<String> list : splitList) {
//                        List<SaleOrderAndDtlDto> soAndItemList = basicSaleOrderApi.getBySoAndItemList(list, soLineNoList);
//                        saleOrderAndDtlDtoList.addAll(soAndItemList);
//                    }
//
//                }else {
//                    saleOrderAndDtlDtoList = basicSaleOrderApi.getBySoAndItemList(soNOList, soLineNoList);
//                }
//
//                saleOrderAndDtlDtoList = saleOrderAndDtlDtoList.stream().distinct().collect(Collectors.toList());
//
//
//                //待出库的记录
//                List<AsnSaleInDto> asnSaleInDtoListOut = new ArrayList<>();
//
//                for (AsnSaleInDto asnSaleInDto : asnSaleInDtoList) {
//                    for (SaleOrderAndDtlDto saleOrderAndDtlDto : saleOrderAndDtlDtoList) {
//                        if (saleOrderAndDtlDto.getSo().equals(asnSaleInDto.getSoNo())&&saleOrderAndDtlDto.getSoItem().equals(asnSaleInDto.getSoLineNo())) {
//                            //TODO 后续确认取什么值做条件判断
////                            saleOrderAndDtlDto.getIsCskd()
//                            asnSaleInDtoListOut.add(asnSaleInDto);
//                        }
//                    }
//                }
//
//
//                //出库：建一个出库单&明细，类型是：D98。调其他出库的服务自动出库。
//                //处理完之后，入库单明细行，备用字段UDF1记录下1。
//
//
//            } catch (Exception e) {
//                e.printStackTrace();
//            } finally {
//                lock.unlock();
//            }
//
//        }, this.getCron());
//
//    }
//
//    /**
//     * 构造CRON表达式
//     */
//    public String getCron() {
//
//        //若果为TRUE，表示执行定时任务
//        if (!startScheduleFlag) {
//            //返回不执行定时任务标识
//            return ScheduledTaskRegistrar.CRON_DISABLED;
//        }
//
//        log.info("【数据回写】执行的cron表达式:{}", cron);
//        //TODO 暂时不启动
////        return cron;
//        return ScheduledTaskRegistrar.CRON_DISABLED;
//    }
}